home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_64 / driver.c < prev    next >
C/C++ Source or Header  |  1995-01-01  |  3KB  |  193 lines

  1. /*
  2.     Example code that uses CT-VOICE.DRV to access the Soundblaster
  3.     DAC channel.
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <alloc.h>
  8. #include <dos.h>
  9. #include <io.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. char far *driver_mem = NULL;
  14. void far (*driver)(void) = NULL;
  15.  
  16. void LoadDriver(void)
  17. {
  18.     FILE *f;
  19.     long length;
  20.     char *sp;
  21.     char sn[129];
  22.  
  23.     strcpy(sn,"");
  24.     sp = getenv("SOUND");
  25.     if(sp)
  26.     {
  27.         strcpy(sn,sp);
  28.         if(sn[strlen(sn)-1] != '\\')
  29.             strcat(sn,"\\");
  30.     }
  31.     strcat(sn,"drv\\CT-VOICE.DRV");
  32.  
  33.     f = fopen(sn,"rb");
  34.     if(!f)
  35.         return;
  36.     length = filelength(fileno(f));
  37.  
  38.     driver_mem = (char far *)malloc((int)length + 16);
  39.     if(FP_SEG(driver_mem) != 0)
  40.         driver = MK_FP(FP_SEG(driver_mem)+1,0);
  41.     else
  42.         driver = driver_mem;
  43.  
  44.     fread(driver,1,(int)length,f);
  45.  
  46.     fclose(f);
  47. }
  48.  
  49. int GetVersion(void)
  50. {
  51.     _BX = 0;
  52.     (*driver)();
  53.     return _AX;
  54. }
  55.  
  56. void SetIOAddr(int base)
  57. {
  58.     _BX = 1;
  59.     _AX = base;
  60.     (*driver)();
  61. }
  62.  
  63. void SetIRQ(int irq)
  64. {
  65.     _BX = 2;
  66.     _AX = irq;
  67.     (*driver)();
  68. }
  69.  
  70. int InitialiseDriver(void)
  71. {
  72.     _BX = 3;
  73.     (*driver)();
  74.     return _AX;
  75. }
  76.  
  77. void UninstallDriver(void)
  78. {
  79.     _BX = 9;
  80.     (*driver)();
  81. }
  82.  
  83. void SpeakerOnOff(int onoff)
  84. {
  85.     _BX = 4;
  86.     _AX = onoff & 0x0001;
  87.     (*driver)();
  88. }
  89.  
  90. void SetStatusWord(unsigned int *addr)
  91. {
  92.     _BX = 5;
  93.     _ES = FP_SEG(addr);
  94.     _DI = FP_OFF(addr);
  95.     (*driver)();
  96. }
  97.  
  98. void OutputVoice(char *buffer)
  99. {
  100.     _BX = 6;
  101.     _ES = FP_SEG(buffer);
  102.     _DI = FP_OFF(buffer);
  103.     (*driver)();
  104. }
  105.  
  106. void InputVoice(int sample_rate, char *buffer, long length)
  107. {
  108.     _BX = 7;
  109.     _AX = sample_rate;
  110.     _ES = FP_SEG(buffer);
  111.     _DI = FP_OFF(buffer);
  112.     _DX = (unsigned)(length >> 16);
  113.     _CX = (unsigned)(length & 0x0000ffff);
  114.     (*driver)();
  115. }
  116.  
  117. void StopVoiceProcess(void)
  118. {
  119.     _BX = 8;
  120.     (*driver)();
  121. }
  122.  
  123. int PauseOutputVoice(void)
  124. {
  125.     _BX = 10;
  126.     (*driver)();
  127.     return _AX;
  128. }
  129.  
  130. int ContinueOutputVoice(void)
  131. {
  132.     _BX = 11;
  133.     (*driver)();
  134.     return _AX;
  135. }
  136.  
  137. char *LoadVOC(char *name)
  138. {
  139.     FILE *f;
  140.     char *buf;
  141.     long length;
  142.  
  143.     f = fopen(name,"rb");
  144.     if(!f)
  145.         return NULL;
  146.  
  147.     length = filelength(fileno(f)) - 0x1a;
  148.  
  149.     buf = (char *)malloc((int)length);
  150.     fseek(f,0x1a,SEEK_SET);
  151.     fread(buf,1,length,f);
  152.  
  153.     fclose(f);
  154.     return buf;
  155. }
  156.  
  157. void main(int argc, char *argv[])
  158. {
  159.     char *b;
  160.     int status;
  161.  
  162.     LoadDriver();
  163.     if(driver == NULL)
  164.     {
  165.         printf("Could not load CT-VOICE.DRV\n");
  166.         exit(1);
  167.     }
  168.  
  169.     printf("Voice version %d\n",GetVersion());
  170.  
  171.     if(InitialiseDriver())
  172.     {
  173.         printf("Could not initialise driver.\n");
  174.         exit(1);
  175.     }
  176.     SetStatusWord(&status);
  177.  
  178.     b = LoadVOC(argv[1]);
  179.  
  180.     OutputVoice(b);
  181.  
  182.     while(status)
  183.         ;
  184.  
  185.     free(b);
  186.  
  187.     UninstallDriver();
  188.  
  189.     free(driver_mem);
  190.  
  191.     exit(0);
  192. }
  193.